package com.pray.praymall.search.thread;

import javax.sound.midi.Soundbank;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * do something
 *
 * @author 魂悸魄
 * @date 2020/9/17 11:01
 */
public class ThreadTest {
    public static ExecutorService pool = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("main start");
//        CompletableFuture<Integer> feture = CompletableFuture.supplyAsync(() -> {
//            System.out.println("当前线程：" + Thread.currentThread().getName());
//            int i = 10 / 2;
//            System.out.println("运行结果：" + i);
//            return i;
        // 方法完成后的感知
//        }, pool).whenComplete((res, exception) -> {
//            // 虽然能得到异常信息，但是没发返回修改数据
//            System.out.println("异步任务成功完成了。。。结果是：" + res + "异常是：" + exception);
//        }).exceptionally(throwable -> {
//            // 可以感知异常，同时返回默认值
//            return 10;
//        });


        // 方法执行完成后的处理
//        CompletableFuture<Integer> feture = CompletableFuture.supplyAsync(() -> {
//            System.out.println("当前线程：" + Thread.currentThread().getName());
//            int i = 10 / 4;
//            System.out.println("运行结果：" + i);
//            return i;
//        }, pool).handle((res, throwable) -> {
//            if (res != null) {
//                return res * 2;
//            }
//            if (throwable != null) {
//                return 0;
//            }
//            return 0;
//        });


        /*
            线程串行化
                1、thenRun：不能获取到上一步的执行结果，五返回值
                .thenRunAsync(() -> {
                    System.out.println("任务2启动了");
                }, pool);
                2、thenAccept：能接受上一步结果，但是无返回值
                .thenAcceptAsync(res -> {
                    System.out.println("任务2启动了：" + res);
                }, pool);
                3、thenApply：能接受上一步结果，有返回值
         */
        /*CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            System.out.println("当前线程：" + Thread.currentThread().getName());
            int i = 10 / 4;
            System.out.println("运行结果：" + i);
            return i;
        }, pool).thenApplyAsync(res -> {
            System.out.println("任务2启动了：" + res);
            return 223;
        }, pool);

        Integer integer = future.get();
        System.out.println("main end " + integer);*/

        // 两个任务只要有一个完成我们就执行任务3
        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务1线程名字：" + Thread.currentThread().getName());
            System.out.println("任务1结束");
            return "hello1";
        }, pool);

        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务2线程名字：" + Thread.currentThread().getName());
            System.out.println("任务2结束");
            return "hello2";
        }, pool);

        future1.runAfterEitherAsync(future2, () -> {
            System.out.println("任务3开始。。。");
        }, pool);



    }


    public static class Thread01 extends Thread {
        @Override
        public void run() {
            System.out.println("当前线程：" + Thread.currentThread().getName());
            int i = 10 / 2;
            System.out.println("运行结果：" + i);
        }
    }

    public static class Runnable01 implements Runnable {

        @Override
        public void run() {
            System.out.println("当前线程：" + Thread.currentThread().getName());
            int i = 10 / 2;
            System.out.println("运行结果：" + i);
        }
    }
}
